home *** CD-ROM | disk | FTP | other *** search
/ Netware Super Library / Netware Super Library.iso / mis_util / ndxkey / indexkey.asm next >
Encoding:
Assembly Source File  |  1985-08-28  |  7.5 KB  |  486 lines

  1. ;***********************************************
  2. CODESEG    SEGMENT    BYTE PUBLIC 'CODE'
  3.     ASSUME    CS:CODESEG,DS:CODESEG,ES:CODESEG
  4. ;
  5. ;----------------------------------------------
  6. INDXKEY    PROC    FAR
  7.     ORG    100H
  8. START:    JMP    ENTER
  9. ASCIIZ    DB    80 DUP (0)
  10. FILE_BUFF DB    150 DUP (?)
  11. CURR_DRIVE DB   ?
  12. CURR_DIR  DB    '\',63 DUP (?)
  13. PATH_FLAG DB    0
  14. DRIVE_FLAG DB   0
  15. COUNTER    DB   1
  16. BYTES_READ DW    ?
  17. DEFAULT DB      '*.NDX',0
  18. DTA    DB    30 DUP (?)
  19. FILENAME DB    13 DUP (?)
  20. BAD_DOS DB    'INCORRECT DOS VERSION - MUST BE 2.0 OR GREATER'
  21.     DB    0DH,0AH,'$'
  22. ERRMSG1 DB    'FILE NOT FOUND',0DH,0AH,'$'
  23. ERRMSG2 DB    'ACCESS DENIED',0DH,0AH,'$'
  24. ERRMSG3    DB    'READ ACCESS TO REQUESTED FILE NOT PERMITTED'
  25.     DB    0DH,0AH,'$'
  26. ERRMSG4 DB    'INVALID FILE HANDLE',0DH,0AH,'$'
  27. ERRMSG5 DB    'PATH NOT FOUND',0DH,0AH,'$'
  28. ERRMSG6 DB    'TOO MANY FILES ARE OPEN',0DH,0AH,'$'
  29. FILEMSG DB    'ENTER FILENAME (<RETURN> FOR *.NDX):  ','$'
  30. CONT_MSG DB    0DH,0AH,'PRESS ANY KEY TO CONTINUE...$'
  31. ;
  32. ENTER:    PUSH    AX
  33.     PUSH    BX
  34.     PUSH    CX
  35.     PUSH    DX
  36.     PUSH    SI
  37.     PUSH    DI
  38.     MOV    AX,CS
  39.     MOV    DS,AX
  40.     MOV    ES,AX
  41.     XOR    AX,AX
  42.     CLC
  43.     CALL    CHECK_DOS
  44.     JNC    DOS_OK
  45.     MOV    DX,OFFSET BAD_DOS
  46.     CALL    PRINTMESS
  47.     JMP    EXIT
  48. DOS_OK:
  49.     CALL    SET_DTA
  50.     CALL    GET_DRIVE
  51.     MOV    CURR_DRIVE,AL
  52.     MOV    SI,80H
  53. MOVE_FILENAME:
  54.     MOV    DI,OFFSET ASCIIZ
  55.     XOR    CX,CX
  56.     MOV    CL,[SI]
  57.     CMP    CL,0
  58.     JNZ    YES_FILE
  59.     MOV    DX,OFFSET FILEMSG
  60.     CALL    PRINTMESS
  61.     MOV    DX,7FH
  62.     MOV    BYTE PTR [SI-1],80
  63.     MOV    AH,0AH
  64.     INT    21H
  65.     CALL    CRLF
  66.     INC    DX
  67.     MOV    BX,DX
  68.      CMP    BYTE PTR [BX],0
  69.     JNE    NAMENTRD
  70.     MOV    CX,6
  71.     MOV    SI,OFFSET DEFAULT
  72. REP    MOVSB
  73.     JMP    PROCESS_FILE
  74. NAMENTRD:
  75.     XOR    CX,CX
  76.     MOV    CL,[BX]
  77.     INC    SI
  78.     PUSH    DI
  79.     MOV    DI,OFFSET ASCIIZ
  80.     PUSH    CX
  81. REP    MOVSB
  82.     POP    CX
  83.     POP    DI
  84.     PUSH    DI
  85.     MOV    DI,BX
  86.     INC    DI
  87.     CLD
  88.     CLC
  89.     CALL    IS_PATH
  90.     POP    DI
  91.     JNC    MOVE_NAME
  92.     CALL    GET_DIR
  93.     OR     PATH_FLAG,0FFH
  94. MOVE_NAME:
  95.     MOV    BX,DX
  96.     ADD    DL,[BX]
  97.     ADC    DH,0
  98.     INC    DX
  99.     MOV    BX,DX
  100.     MOV    BYTE PTR [BX],0
  101.     JMP    PROCESS_FILE
  102. YES_FILE:
  103.     DEC    CL
  104.     ADD    SI,2
  105.     CLD
  106.     CLC
  107.     PUSH    DI
  108.     MOV    DI,SI
  109.     CALL    IS_PATH
  110.     POP    DI
  111.     JNC    DO_MOVE
  112.     OR     PATH_FLAG,0FFH
  113. DO_MOVE:
  114. REP     MOVSB
  115.     MOV    BYTE PTR [DI],0
  116. PROCESS_FILE:
  117.     PUSH    SI
  118.     MOV    SI,OFFSET ASCIIZ + 1
  119.     CMP     BYTE PTR [SI],':'
  120.     JNE    CHEK_PATH
  121.     DEC    SI
  122.     MOV    DL,[SI]
  123.     AND    DL,0DFH
  124.     SUB    DL,'A'
  125.     CALL    SET_DRIVE
  126.     OR    DRIVE_FLAG,0FFH
  127.     POP    SI
  128. CHEK_PATH:
  129.     TEST    PATH_FLAG,0FFH
  130.     JZ    GO_AHEAD
  131.     CALL    GET_DIR
  132.     PUSH    DI
  133.     MOV    DI,80H
  134.     XOR    CX,CX
  135.     MOV    CL,[DI]
  136.     ADD    DI,[DI]
  137.     AND    DI,0FFH
  138.     STD
  139.     MOV    AL,'\'
  140. REPNE    SCASB
  141.     INC    DI
  142.     MOV    BYTE PTR [DI],0
  143.     CLD
  144.     POP    DI
  145. GO_AHEAD:
  146.     CLC
  147.     MOV    AL,0
  148.     CALL    FIND_FILE
  149.     JNC    FILE_FOUND
  150.     JMP    EXIT
  151. FILE_FOUND:
  152.     MOV    DX,81H
  153.     MOV    SI,DX
  154.     CMP    BYTE PTR [SI],' '
  155.     JNE    CHANGE_IT
  156.     INC    DX
  157. CHANGE_IT:
  158.     CALL    CHANGE_DIR
  159. OPEN_IT:
  160.     MOV    AL,0
  161.     CALL    OPEN_FILE
  162.     JC    EXIT
  163.     MOV    BX,AX
  164.     PUSH    BX
  165.     CLC
  166.     CALL    READ_FILE
  167.     POP    BX
  168.     JC    EXIT
  169.     CLC
  170.     CALL    CLOSE_FILE
  171.     JC    EXIT
  172.     CALL    CRLF
  173.     MOV    BX,OFFSET ASCIIZ
  174.     MOV    DI,OFFSET ASCIIZ
  175.     MOV    CX,SIZE ASCIIZ
  176.     MOV    AL,'*'
  177. REPNE    SCASB
  178.     JCXZ    FILE_DISP_LOOP
  179.     MOV    BX,OFFSET FILENAME
  180. FILE_DISP_LOOP:
  181.     MOV    DL,BYTE PTR [BX]
  182.     MOV    AH,2
  183.     INT    21H
  184.     INC    BX
  185.     CMP    BYTE PTR [BX],00H
  186.     JNZ    FILE_DISP_LOOP
  187. ;
  188.     CALL    CRLF
  189.     MOV    DL,9
  190.     MOV    AH,2
  191.     INT    21H
  192.     MOV    SI,OFFSET FILE_BUFF+10
  193.     CMP    BYTE PTR [SI],'!'
  194.     JGE    PRINTKEY
  195.     MOV    SI,OFFSET FILE_BUFF+24
  196. PRINTKEY:
  197.     MOV    DL,[SI]
  198.     CMP    DL,20H
  199.     JL         NEXT_FILE
  200.     MOV    AH,2
  201.     INT    21H
  202.     INC    SI
  203.     JMP    SHORT PRINTKEY
  204. NEXT_FILE:
  205.     CALL    CRLF
  206.     INC    COUNTER
  207.     CMP    COUNTER,7
  208.     JLE    CONTINUE
  209.     MOV    COUNTER,1
  210.     MOV    DX,OFFSET CONT_MSG
  211.     MOV    AH,9
  212.     INT    21H
  213.     MOV    AH,8
  214.     INT    21H
  215. CONTINUE:
  216.     CALL    FIND_NEXT
  217.     JC    EXIT
  218.     JMP    FILE_FOUND
  219. EXIT:    TEST    PATH_FLAG,0FFH
  220.     JZ    TEST_DRIVE
  221.     MOV    DX,OFFSET CURR_DIR
  222.     CALL    CHANGE_DIR
  223. TEST_DRIVE:
  224.     TEST    DRIVE_FLAG,0FFH
  225.     JZ    EXIT2
  226.     MOV    DL,CURR_DRIVE
  227.     CALL    SET_DRIVE
  228. EXIT2:    POP    DI
  229.     POP    SI
  230.     POP    DX
  231.     POP    CX
  232.     POP    BX
  233.     POP    AX
  234.     CALL    CRLF
  235.     INT    20H
  236. INDXKEY    ENDP
  237. ;-------------------------------------------
  238. SET_DTA PROC    NEAR
  239.     PUSH    AX
  240.     PUSH    DX
  241.     MOV    DX,OFFSET DTA
  242.     MOV    AH,1AH
  243.     INT    21H
  244.     POP    DX
  245.     POP    AX
  246.     RET
  247. SET_DTA ENDP
  248. ;-------------------------------------------
  249. CHECK_DOS PROC    NEAR
  250.     PUSH    AX
  251.     MOV    AH,30H
  252.     INT    21H
  253.     CMP    AL,2
  254.     POP    AX
  255.     RET
  256. CHECK_DOS ENDP
  257. ;--------------------------------------------
  258. FIND_FILE PROC    NEAR
  259.     PUSH    AX
  260.     PUSH    CX
  261.     PUSH    DX
  262.     MOV    AH,4EH
  263.     XOR    CX,CX
  264.     MOV    DX,OFFSET ASCIIZ
  265.     INT    21H
  266.     JNC    END_FIND
  267.     CMP    AL,12H
  268.     JNZ    CHECK_PATH2
  269.     MOV    DX,OFFSET ERRMSG1
  270.     CALL    PRINTMESS
  271.     STC
  272.     JMP    END_FIND
  273. CHECK_PATH2:
  274.     CMP    AL,3
  275.     JNZ    CHECK_FILES2
  276.     MOV    DX,OFFSET ERRMSG5
  277.     CALL    PRINTMESS
  278.     STC
  279.     JMP    END_FIND
  280. CHECK_FILES2:
  281.     CMP    AL,4
  282.     JNZ    ACCESS_ERR2
  283.     MOV    DX,OFFSET ERRMSG6
  284.     CALL    PRINTMESS
  285.     STC
  286.     JMP    END_FIND
  287. ACCESS_ERR2:
  288.     CMP    AL,5
  289.     JNZ    BAD_CODE2
  290.     MOV    DX,OFFSET ERRMSG2
  291.     CALL    PRINTMESS
  292.     STC
  293.     JMP    END_FIND
  294. BAD_CODE2:
  295.     MOV    DX,OFFSET ERRMSG3
  296.     CALL    PRINTMESS
  297.     STC
  298. END_FIND:
  299.     POP    DX
  300.     POP    CX
  301.     POP    AX
  302.     RET
  303. FIND_FILE ENDP
  304. ;--------------------------------------------
  305. OPEN_FILE PROC    NEAR
  306.     PUSH    DX
  307.     MOV    AH,3DH
  308.     MOV    DX,OFFSET FILENAME
  309.     INT    21H
  310.     JNC    LEAVE
  311.     CMP    AL,2
  312.     JNZ    CHECK_PATH
  313.     MOV    DX,OFFSET ERRMSG1
  314.     CALL    PRINTMESS
  315.     STC
  316.     JMP    LEAVE
  317. CHECK_PATH:
  318.     CMP    AL,3
  319.     JNZ    CHECK_FILES
  320.     MOV    DX,OFFSET ERRMSG5
  321.     CALL    PRINTMESS
  322.     STC
  323.     JMP    LEAVE
  324. CHECK_FILES:
  325.     CMP    AL,4
  326.     JNZ    ACCESS_ERR
  327.     MOV    DX,OFFSET ERRMSG6
  328.     CALL    PRINTMESS
  329.     STC
  330.     JMP    LEAVE
  331. ACCESS_ERR:
  332.     CMP    AL,5
  333.     JNZ    BAD_CODE
  334.     MOV    DX,OFFSET ERRMSG2
  335.     CALL    PRINTMESS
  336.     STC
  337.     JMP    LEAVE
  338. BAD_CODE:
  339.     MOV    DX,OFFSET ERRMSG3
  340.     CALL    PRINTMESS
  341.     STC
  342. LEAVE:    POP    DX
  343.     RET
  344. OPEN_FILE ENDP
  345. ;-----------------------------------------
  346. READ_FILE PROC    NEAR
  347.     PUSH    AX
  348.     PUSH    CX
  349.     PUSH    DX
  350.     MOV    CX,SIZE FILE_BUFF
  351.     MOV    DX,OFFSET FILE_BUFF
  352.     MOV    AH,3FH
  353.     INT    21H
  354.     JNC    GOOD_READ
  355.     CMP    AL,5
  356.     JNZ    BAD_HANDLE
  357.     MOV    DX,OFFSET ERRMSG3
  358.     CALL    PRINTMESS
  359.     STC
  360.     JMP    LEAVE_READ
  361. BAD_HANDLE:
  362.     MOV    DX,OFFSET ERRMSG4
  363.     CALL    PRINTMESS
  364.     STC
  365.     JMP    LEAVE_READ
  366. GOOD_READ:
  367.     MOV    BYTES_READ,AX
  368. LEAVE_READ:
  369.     POP    DX
  370.     POP    CX
  371.     POP    AX
  372.     RET
  373. READ_FILE ENDP
  374. ;-------------------------------------------
  375. CLOSE_FILE PROC    NEAR
  376.     PUSH    AX
  377.     PUSH    DX
  378.     MOV    AH,3EH
  379.     INT    21H
  380.     JNC    LEAVE_CLOSE
  381.     MOV    DX,OFFSET ERRMSG4
  382.     CALL    PRINTMESS
  383.     STC
  384. LEAVE_CLOSE:
  385.     POP    DX
  386.     POP    AX
  387.     RET
  388. CLOSE_FILE ENDP
  389. ;-------------------------------------------
  390. FIND_NEXT PROC    NEAR
  391.     PUSH    AX
  392.     PUSH    DX
  393.     MOV    DX,OFFSET DTA
  394.     MOV    AH,4FH
  395.     INT    21H
  396.     POP    DX
  397.     POP    AX
  398.     RET
  399. FIND_NEXT ENDP
  400. ;-------------------------------------------
  401. PRINTMESS PROC NEAR
  402.     PUSH    AX
  403.     MOV    AH,9
  404.     INT    21H
  405.     POP    AX
  406.     RET
  407. PRINTMESS ENDP
  408. ;------------------------------------------
  409. CRLF    PROC    NEAR
  410.     PUSH    AX
  411.     PUSH    DX
  412.     MOV    DL,0DH
  413.     MOV    AH,2
  414.     INT    21H
  415.     MOV    DL,0AH
  416.     MOV    AH,2
  417.     INT    21H
  418.     POP    DX
  419.     POP    AX
  420.     RET
  421. CRLF    ENDP
  422. ;------------------------------------------
  423. CURSREAD PROC    NEAR
  424.     PUSH    AX
  425.     PUSH    BX
  426.     MOV    AH,3
  427.     MOV    BH,0
  428.     INT    10H
  429.     POP    BX
  430.     POP    AX
  431.     RET
  432. CURSREAD ENDP
  433. ;------------------------------------------
  434. IS_PATH PROC    NEAR
  435.     PUSH    AX
  436.     PUSH    CX
  437.     PUSH    DI
  438.     MOV    AL,'\'
  439. REPNE   SCASB
  440.     JCXZ    LEAVE_IS_PATH
  441.     STC
  442. LEAVE_IS_PATH:
  443.     POP    DI
  444.     POP    CX
  445.     POP    AX
  446.     RET
  447. IS_PATH ENDP
  448. ;-------------------------------------------
  449. GET_DRIVE PROC    NEAR
  450.     MOV    AH,19H
  451.     INT    21H
  452.     RET
  453. GET_DRIVE ENDP
  454. ;-------------------------------------------
  455. GET_DIR    PROC    NEAR
  456.     PUSH    AX
  457.     PUSH    SI
  458.     PUSH    DX
  459.     MOV    AH,47H
  460.     MOV    SI,OFFSET CURR_DIR+1
  461.     MOV    DL,0
  462.     INT    21H
  463.     POP    DX
  464.     POP    SI
  465.     POP    AX
  466.     RET
  467. GET_DIR ENDP 
  468. ;-------------------------------------------
  469. SET_DRIVE PROC    NEAR
  470.     MOV    AH,0EH
  471.     INT    21H
  472.     RET
  473. SET_DRIVE ENDP
  474. ;-------------------------------------------
  475. CHANGE_DIR PROC    NEAR
  476.     PUSH    AX
  477.     MOV    AH,3BH
  478.     INT    21H
  479.     POP    AX
  480.     RET
  481. CHANGE_DIR ENDP
  482. ;-------------------------------------------
  483. CODESEG    ENDS
  484. ;********************************************
  485.     END    START
  486.